package br.ufscar.acumaaf.smc.dao;

import java.util.ArrayList;
import java.util.List;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.util.Log;
import br.ufscar.acumaaf.smc.model.Sessao;
import br.ufscar.acumaaf.smc.persistence.DataBaseHelper;


public class SessaoDAO {

	private DataBaseHelper dataBaseHelper;
	private SQLiteDatabase db;
	
	public SessaoDAO(Context context) {
		dataBaseHelper = new DataBaseHelper(context);
		db = dataBaseHelper.getWritableDatabase();
	}
	
	public boolean inserirSessao(Sessao sessao){
		ContentValues s = new ContentValues();
		s.put("codigosessao", sessao.getCodigoSessao());
		s.put("data", sessao.getData().toString());
		s.put("codigogrupoatividadefisica", sessao.getCodigoGrupoAtividadeFisica());
		s.put("sincronizar", sessao.getSincronizar());
		s.put("excluir", sessao.getExcluir());
		try{
			Long retorno = db.insert("sessao", null, s);
			Log.i(DataBaseHelper.FILTRO, "SessaoDAO:insereSessao | Inserindo " + s + " no Banco de Dados. Retorno = " + retorno + " (ID da linha recém-inserida ou -1 caso tenha ocorrido um erro!)");
			Log.i(DataBaseHelper.FILTRO,"SessaoDAO:insereSessao | Fechando o Bando de Dados!");
			//fechando o Banco de Dados
			dataBaseHelper.close();
			db.close();
			if(retorno == Long.valueOf("-1")){
				Log.i(DataBaseHelper.FILTRO,"SessaoDAO:insereSessao | Retorno false!");
				return false;
			}
			else{
				Log.i(DataBaseHelper.FILTRO,"SessaoDAO:insereSessao | Retorno true!");
				return true;
			}
		} catch (Exception e) {
			Log.e("erro", "SessaoDAO:inserirSessao(): | Gerou uma exceção e não inseriu a sessão no Banco de Dados", e);
			return false;
		}
	}
	
	public boolean atualizaSessao(Sessao sessao){
		ContentValues s = new ContentValues();
		s.put("codigosessao", sessao.getCodigoSessao());
		s.put("data", sessao.getData());
		s.put("codigogrupoatividadefisica", sessao.getCodigoGrupoAtividadeFisica());
		s.put("sincronizar", sessao.getSincronizar());
		s.put("excluir", sessao.getExcluir());
		int retorno = db.update("sessao", s, "codigosessao = " + sessao.getCodigoSessao(), null);
		if(retorno > 0){
			Log.i(DataBaseHelper.FILTRO,"SessaoDAO:atualizaSessao | Atualizando a Sessão de código " + sessao.getCodigoSessao() + " do Banco de Dados. Retorno = " + retorno + "(Número de linhas afetadas pela atualização!)");
			Log.i(DataBaseHelper.FILTRO,"SessaoDAO:atualizaSessao | Fechando o Bando de Dados!");
			//fechando o Banco de Dados
			dataBaseHelper.close();
			db.close();
			return true;
		}
		else{
			Log.i(DataBaseHelper.FILTRO,"SessaoDAO:atualizaSessao | Falha ao tentar atualizar uma sessão. Retorno = " + retorno + "(Número de linhas afetadas pela atualização!)");
			Log.i(DataBaseHelper.FILTRO,"SessaoDAO:atualizaSessao | Fechando o Bando de Dados!");
			//fechando o Banco de Dados
			dataBaseHelper.close();
			db.close();
			return false;
		}			
	}
	
	public void deletaSessao(Long codigo){
		int retorno = db.delete("sessao", "codigosessao = " + codigo, null);
		if(retorno > 0){
			Log.i(DataBaseHelper.FILTRO,"SessaoDAO:deletaSessao | Deletando a Sessão de código " + codigo + " do Banco de Dados. Retorno = " + retorno + "(Número de linhas afetadas pela Deleção!)");
		}
		else{
			Log.i(DataBaseHelper.FILTRO,"SessaoDAO:deletaSessao | Falha ao tentar deletar uma sessão. Retorno = " + retorno + "(Número de linhas afetadas pela Deleção!)");
		}
		Log.i(DataBaseHelper.FILTRO,"SessaoDAO:deletaSessao | Fechando o Bando de Dados!");
		//fechando o Banco de Dados
		dataBaseHelper.close();
		db.close();
	}
	
	public Sessao buscarSessaoPeloCodigo(Integer codigo){
		Cursor cursor = null;
		Sessao sessao = new Sessao();
		try {
			 cursor = db.query(true, "sessao", new String[]{"codigosessao","data","codigogrupoatividadefisica","sincronizar","excluir"} , "codigosessao = " + codigo, null, null, null, null, null);
			 if(cursor.getCount() > 0){
				int codigoSessaoIndex = cursor.getColumnIndex("codigosessao");
				int dataIndex = cursor.getColumnIndex("data");
				int codigogrupoatividadefisicaIndex = cursor.getColumnIndex("codigogrupoatividadefisica");
				int sincronizarIndex = cursor.getColumnIndex("sincronizar");
				int excluirIndex = cursor.getColumnIndex("excluir");
				cursor.moveToFirst();
				sessao.setCodigoSessao(cursor.getInt(codigoSessaoIndex));
				sessao.setCodigoGrupoAtividadeFisica(cursor.getInt(codigogrupoatividadefisicaIndex));
				sessao.setData(cursor.getString(dataIndex));
				sessao.setSincronizar(cursor.getInt(sincronizarIndex));
				sessao.setExcluir(cursor.getInt(excluirIndex));
				cursor.moveToNext();
			}
			 Log.i(DataBaseHelper.FILTRO,"SessaoDAO:buscarSessaoPeloCodigo | Retornando a sessao " + sessao);
			 if(cursor != null){
					cursor.close();
					dataBaseHelper.close();
					db.close();
				}
			 return sessao;
		} 
		finally{
			if(cursor != null){
				cursor.close();
				db.close();
			}
		}
	}

	public List<Sessao> buscarTodasSessoes(){
		Cursor cursor = null;
		try {
			List<Sessao> listaSessoes = new ArrayList<Sessao>();
			cursor = db.query("sessao", new String[]{"codigosessao", "data", "codigogrupoatividadefisica", "sincronizar", "excluir"}, null, null, null, null, null);
			if(cursor.getCount() > 0){
				int codigoSessaoIndex = cursor.getColumnIndex("codigosessao");
				int dataIndex = cursor.getColumnIndex("data");
				int codigogrupoatividadefisicaIndex = cursor.getColumnIndex("codigogrupoatividadefisica");
				int sincronizarIndex = cursor.getColumnIndex("sincronizar");
				int excluirIndex = cursor.getColumnIndex("excluir");
				cursor.moveToFirst();
				do{
					Sessao sessao = new Sessao();
					sessao.setCodigoSessao(cursor.getInt(codigoSessaoIndex));
					sessao.setData(cursor.getString(dataIndex));
					sessao.setCodigoGrupoAtividadeFisica(cursor.getInt(codigogrupoatividadefisicaIndex));
					sessao.setSincronizar(cursor.getInt(sincronizarIndex));
					sessao.setExcluir(cursor.getInt(excluirIndex));
					listaSessoes.add(sessao);
					cursor.moveToNext();					
				}while(!cursor.isAfterLast());
			}
			if(cursor != null){
				cursor.close();
				dataBaseHelper.close();
				db.close();
			}
			return listaSessoes;
		} 
		finally{
			if(cursor != null){
				cursor.close();
				dataBaseHelper.close();
				db.close();
			}
		}
	}
	
	public List<Sessao> buscarTodasSessoesParaSincronizar(){
		Cursor cursor = null;
		try {
			List<Sessao> listaSessoes = new ArrayList<Sessao>();
			cursor = db.query("sessao", new String[]{"codigosessao", "data", "codigogrupoatividadefisica", "sincronizar", "excluir"}, "sincronizar = 1", null, null, null, "data");
			if(cursor.getCount() > 0){
				int codigoSessaoIndex = cursor.getColumnIndex("codigosessao");
				int dataIndex = cursor.getColumnIndex("data");
				int codigogrupoatividadefisicaIndex = cursor.getColumnIndex("codigogrupoatividadefisica");
				int sincronizarIndex = cursor.getColumnIndex("sincronizar");
				int excluirIndex = cursor.getColumnIndex("excluir");
				cursor.moveToFirst();
				do{
					Sessao sessao = new Sessao();
					sessao.setCodigoSessao(cursor.getInt(codigoSessaoIndex));
					sessao.setCodigoGrupoAtividadeFisica(cursor.getInt(codigogrupoatividadefisicaIndex));
					sessao.setData(cursor.getString(dataIndex));
					sessao.setSincronizar(cursor.getInt(sincronizarIndex));
					sessao.setExcluir(cursor.getInt(excluirIndex));
					listaSessoes.add(sessao);
					cursor.moveToNext();					
				}while(!cursor.isAfterLast());
			}
			if(cursor != null){
				cursor.close();
				dataBaseHelper.close();
				db.close();
			}
			return listaSessoes;
		} 
		finally{
			if(cursor != null){
				cursor.close();
				dataBaseHelper.close();
				db.close();
			}
		}
	}
	
	public List<Sessao> buscarTodasSessoesParaDeletar(){
		Cursor cursor = null;
		try {
			List<Sessao> listaSessoes = new ArrayList<Sessao>();
			cursor = db.query("sessao", new String[]{"codigosessao", "data", "codigogrupoatividadefisica", "sincronizar", "excluir"}, "excluir = 1", null, null, null, "data");
			if(cursor.getCount() > 0){
				int codigoSessaoIndex = cursor.getColumnIndex("codigosessao");
				int dataIndex = cursor.getColumnIndex("data");
				int codigogrupoatividadefisicaIndex = cursor.getColumnIndex("codigogrupoatividadefisica");
				int sincronizarIndex = cursor.getColumnIndex("sincronizar");
				int excluirIndex = cursor.getColumnIndex("excluir");
				cursor.moveToFirst();
				do{
					Sessao sessao = new Sessao();
					sessao.setCodigoSessao(cursor.getInt(codigoSessaoIndex));
					sessao.setData(cursor.getString(dataIndex));
					sessao.setCodigoGrupoAtividadeFisica(cursor.getInt(codigogrupoatividadefisicaIndex));
					sessao.setSincronizar(cursor.getInt(sincronizarIndex));
					sessao.setExcluir(cursor.getInt(excluirIndex));
					listaSessoes.add(sessao);
					cursor.moveToNext();					
				}while(!cursor.isAfterLast());
			}
			if(cursor != null){
				cursor.close();
				dataBaseHelper.close();
				db.close();
			}
			return listaSessoes;
		} 
		finally{
			if(cursor != null){
				cursor.close();
				dataBaseHelper.close();
				db.close();
			}
		}
	}
}